/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.springBoot.springBootSysCore.modules.services;

import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import com.google.common.collect.Lists;
import com.springBoot.springBootSysCore.modules.entity.system.SysResource;
import com.springBoot.springBootSysCore.modules.repository.system.SysResourceRepository;
import com.springBoot.springBootSysCore.modules.shiro.session.SessionDAO;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.springBoot.springBootSysCore.common.config.Global;
import com.springBoot.springBootSysCore.common.persistence.BaseEntity;
import com.springBoot.springBootSysCore.common.persistence.Page;
import com.springBoot.springBootSysCore.common.service.SysBaseService;
import com.springBoot.springBootSysCore.common.utils.CacheUtils;
import com.springBoot.springBootSysCore.common.utils.StringUtils;
import com.springBoot.springBootSysCore.common.utils.encoding.Digests;
import com.springBoot.springBootSysCore.common.utils.encoding.Encodes;
import com.springBoot.springBootSysCore.common.web.Servlets;
import com.springBoot.springBootSysCore.modules.entity.system.SysRole;
import com.springBoot.springBootSysCore.modules.entity.system.SysUser;
import com.springBoot.springBootSysCore.modules.entity.utils.UserUtils;
import com.springBoot.springBootSysCore.modules.mapper.system.UserMapper;

/**
 * 系统管理，安全相关实体的管理类,包括用户、角色、菜单.
 * @author ThinkGem
 * @version 2013-12-05
 */
@Service
@Transactional(readOnly = true)
public class SystemService extends SysBaseService implements InitializingBean {
	
	public static final String HASH_ALGORITHM = "SHA-1";
	public static final int HASH_INTERATIONS = 1024;
	public static final int SALT_SIZE = 8;


	public static final String SYS_RES_CACHE = "sysResCache";
	@Autowired
	private SessionDAO sessionDao;
	@Autowired
	private SysResourceRepository sysResourceRepository;
	public SessionDAO getSessionDao() {
		return sessionDao;
	}
	//-- User Service --//
	/**
	 * 获取用户
	 * @param id
	 * @return
	 */
	public SysUser getUser(String id) {
		return UserUtils.get(id);
	}

	/**
	 * 根据登录名获取用户
	 * @param account
	 * @return
	 */
	public SysUser getUserByLoginName(String account) {
		return UserUtils.getByAccount(account);
	}
	
	public Page<SysUser> findUser(Page<SysUser> page, SysUser user) {
		// 生成数据权限过滤条件（dsf为dataScopeFilter的简写，在xml中使用 ${sqlMap.dsf}调用权限SQL）
//		user.getSqlMap().put("dsf", dataScopeFilter(user.getCurrentUser(), "o", "a"));
		// 设置分页参数
//		user.setPage(page);
		// 执行分页查询
		System.out.println("检查sql");
//		page.setList(userMapper.select(user));
		return page;
	}
	
	/**
	 * 无分页查询人员列表
	 * @param user
	 * @return
	 */
	public List<SysUser> findUser(SysUser user){
		// 生成数据权限过滤条件（dsf为dataScopeFilter的简写，在xml中使用 ${sqlMap.dsf}调用权限SQL）
//		user.getSqlMap().put("dsf", dataScopeFilter(user.getCurrentUser(), "o", "a"));
		System.out.println("检查sql");
//		List<SysUser> list = userMapper.select(user);
//		return list;
		return null;
	}
	
	@Transactional(readOnly = false)
	public void saveUser(SysUser user) {
		if (StringUtils.isBlank(user.getId())){
			user.preInsert();
			if(StringUtils.isBlank(user.getPassword())){
				user.setPassword(entryptPassword("111111"));
			}
			//检查用户名是否重复等
//			userMapper.insert(user);
		}else{
			System.out.println("检查sql");
			// 清除原用户机构用户缓存
			// User oldUser = userMapper.selectByPrimaryKey(user.getId());
			// 更新用户数据
			user.preUpdate();
//			userMapper.updateByPrimaryKeySelective(user);
		}
		if (StringUtils.isNotBlank(user.getId())){
			// 更新用户与角色关联
			logger.debug("暂时不处理角色管理");
//			userMapper.deleteUserRole(user);
//			if (user.getRoleList() != null && user.getRoleList().size() > 0){
//				userMapper.insertUserRole(user);
//			}else{
//				throw new ServiceException(user.getLoginName() + "没有设置角色！");
//			}
			// 将当前用户同步到Activiti
//			saveActivitiUser(user);
			// 清除用户缓存
			UserUtils.clearCache(user);
//			// 清除权限缓存
//			systemRealm.clearAllCachedAuthorizationInfo();
		}
	}
	
	@Transactional(readOnly = false)
	public void updateUserInfo(SysUser user) {
		user.preUpdate();
//		userMapper.updateByPrimaryKeySelective(user);
		// 清除用户缓存
		UserUtils.clearCache(user);
//		// 清除权限缓存
//		systemRealm.clearAllCachedAuthorizationInfo();
	}
	
	@Transactional(readOnly = false)
	public void deleteUser(SysUser user) {
//		userMapper.delete(user);
		// 同步到Activiti
//		deleteActivitiUser(user);
		// 清除用户缓存
		UserUtils.clearCache(user);
//		// 清除权限缓存
//		systemRealm.clearAllCachedAuthorizationInfo();
	}
	
	@Transactional(readOnly = false)
	public void updatePasswordById(String id, String loginName, String newPassword) {
//		SysUser user = new SysUser(id);
//		user.setPassword(entryptPassword(newPassword));
//		userMapper.updateByExampleSelective(user, ServiceUtils.packagingExample(User.class,"id = "+ id,null));
		// 清除用户缓存
//		user.setLoginName(loginName);
//		UserUtils.clearCache(user);
//		// 清除权限缓存
//		systemRealm.clearAllCachedAuthorizationInfo();
	}
	
	@Transactional(readOnly = false)
	public void updateUserLoginInfo(SysUser user) {
		// 保存上次登录信息
		user.setOldLoginIp(user.getLoginIp());
		user.setOldLoginDate(user.getLoginDate());
		// 更新本次登录信息
		user.setLoginIp(StringUtils.getRemoteAddr(Servlets.getRequest()));
		user.setLoginDate(new Date());
//		userMapper.updateByPrimaryKeySelective(user);
	}
	
	/**
	 * 生成安全的密码，生成随机的16位salt并经过1024次 sha-1 hash
	 */
	public static String entryptPassword(String plainPassword) {
		String plain = Encodes.unescapeHtml(plainPassword);
		byte[] salt = Digests.generateSalt(SALT_SIZE);
		byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);
		return Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword);
	}
	
	/**
	 * 验证密码
	 * @param plainPassword 明文密码
	 * @param password 密文密码
	 * @return 验证成功返回true
	 */
	public static boolean validatePassword(String plainPassword, String password) {
		String plain = Encodes.unescapeHtml(plainPassword);
		byte[] salt = Encodes.decodeHex(password.substring(0,16));
		byte[] hashPassword = Digests.sha1(plain.getBytes(), salt, HASH_INTERATIONS);
		return password.equals(Encodes.encodeHex(salt)+Encodes.encodeHex(hashPassword));
	}
	
	/**
	 * 获得活动会话
	 * @return
	 */
	public Collection<Session> getActiveSessions(){
		return sessionDao.getActiveSessions(false);
	}
	
	//-- Role Service --//
	
	public SysRole getRole(String id) {
//		return roleMapper.selectByPrimaryKey(id);
		return  null;
	}
	public SysRole getRoleByName(String name) {
		SysRole r = new SysRole();
		r.setName(name);
//		return roleMapper.selectOne(r);
		return  null;
	}

	public List<SysRole> findRole(SysRole role){
//		return roleMapper.select(role);
		return null;
	}
	
	public List<SysRole> findAllRole(){
		return UserUtils.getRoleList();
	}
	
	@Transactional(readOnly = false)
	public void saveRole(SysRole role) {
		if (StringUtils.isBlank(role.getId())){
			role.preInsert();
//			roleMapper.insert(role);
		}else{
			role.preUpdate();
//			roleMapper.updateByPrimaryKeySelective(role);
		}
		// 更新角色与菜单关联
//		roleMapper.deleteRoleMenu(role);
//		if (role.getMenuList().size() > 0){
//			roleMapper.insertRoleMenu(role);
//		}
		// 清除用户角色缓存
//		UserUtils.removeCache(UserUtils.CACHE_ROLE_LIST);
//		// 清除权限缓存
//		systemRealm.clearAllCachedAuthorizationInfo();
	}

	@Transactional(readOnly = false)
	public void deleteRole(SysRole role) {
//		roleMapper.delete(role);
		// 清除用户角色缓存
		UserUtils.removeCache(UserUtils.CACHE_ROLE_LIST);
//		// 清除权限缓存
//		systemRealm.clearAllCachedAuthorizationInfo();
	}
	
//	@Transactional(readOnly = false)
//	public Boolean outUserInRole(SysRole role, User user) {
//		List<Role> roles = user.getRoleList();
//		for (Role e : roles){
//			if (e.getId().equals(role.getId())){
//				roles.remove(e);
//				saveUser(user);
//				return true;
//			}
//		}
//		return false;
//	}
//
//	@Transactional(readOnly = false)
//	public User assignUserToRole(Role role, User user) {
//		if (user == null){
//			return null;
//		}
//		List<String> roleIds = Arrays.asList(user.getRoleIds().split(","));
//		if (roleIds.contains(role.getId())) {
//			return null;
//		}
//		user.getRoleList().add(role);
//		saveUser(user);
//		return user;
//	}
//
	//-- Menu Service --//

	/**
	 * 获取从最上级开始逐级往下的菜单列表
	 * @return
	 */
	public List<SysResource> getAllOfPrent(){
		List<SysResource> pRes = (List<SysResource>)CacheUtils.get(SYS_RES_CACHE);
		if(pRes == null){
			pRes = sysResourceRepository.findAllOfParent();
			for (SysResource sysResource : pRes){
				if (sysResource.getChildrenResource() != null){
					sysResource.setChildrenResource(sysResourceRepository.findByParentResourceId(sysResource.getId()));
				}
			}
			CacheUtils.put(SYS_RES_CACHE,pRes);
		}
		return pRes;
	}


//	public Menu getMenu(String id) {
//		return menuMapper.selectByPrimaryKey(id);
//	}
//
//	public List<Menu> findAllMenu(){
//		return UserUtils.getMenuList();
//	}
//
//	@Transactional(readOnly = false)
//	public void saveMenu(Menu menu) {
//
//		// 获取父节点实体
//		menu.setParent(this.getMenu(menu.getParent().getId()));
//
//		// 获取修改前的parentIds，用于更新子节点的parentIds
//		String oldParentIds = menu.getParentIds();
//
//		// 设置新的父节点串
//		menu.setParentIds(menu.getParent().getParentIds()+menu.getParent().getId()+",");
//
//		// 保存或更新实体
//		if (StringUtils.isBlank(menu.getId())){
//			menu.preInsert();
//			menuMapper.insert(menu);
//		}else{
//			menu.preUpdate();
//			menuMapper.updateByPrimaryKeySelective(menu);
//		}
//
//		// 更新子节点 parentIds
//		Menu m = new Menu();
//		m.setParentIds("%,"+menu.getId()+",%");
//		List<Menu> list = menuMapper.selectByExample(
//				ServiceUtils.packagingExample(Menu.class,
//						"del_flag="+BaseEntity.DEL_FLAG_NORMAL + "and  parent_ids like '%"+menu.getId()+"%'","sort"));
////		List<Menu> list = menuMapper.findByParentIdsLike(m);
//		for (Menu e : list){
//			e.setParentIds(e.getParentIds().replace(oldParentIds, menu.getParentIds()));
//			menuMapper.updateByPrimaryKeySelective(e);
//		}
//		// 清除用户菜单缓存
//		UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
////		// 清除权限缓存
////		systemRealm.clearAllCachedAuthorizationInfo();
//		// 清除日志相关缓存
//		CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
//	}
//
//	@Transactional(readOnly = false)
//	public void updateMenuSort(Menu menu) {
//		menuMapper.updateByPrimaryKeySelective(menu);
//		// 清除用户菜单缓存
//		UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
////		// 清除权限缓存
////		systemRealm.clearAllCachedAuthorizationInfo();
//		// 清除日志相关缓存
//		CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
//	}
//
//	@Transactional(readOnly = false)
//	public void deleteMenu(Menu menu) {
//		menuMapper.delete(menu);
//		// 清除用户菜单缓存
//		UserUtils.removeCache(UserUtils.CACHE_MENU_LIST);
////		// 清除权限缓存
////		systemRealm.clearAllCachedAuthorizationInfo();
//		// 清除日志相关缓存
//		CacheUtils.remove(LogUtils.CACHE_MENU_NAME_PATH_MAP);
//	}
	
	/**
	 * 获取Key加载信息
	 */
	public static boolean printKeyLoadMessage(){
		StringBuilder sb = new StringBuilder();
		sb.append("\r\n======================================================================\r\n");
		sb.append("\r\n    欢迎使用 "+Global.getConfig("productName")+"  - Powered By http://jeesite.com\r\n");
		sb.append("\r\n======================================================================\r\n");
		System.out.println(sb.toString());
		return true;
	}
	@Override
	public void afterPropertiesSet() throws Exception {
	}
	public static void main(String[] args) {
		System.out.println(SystemService.entryptPassword("94b0ff017bea7df9a5ef7d1a77b196f0a2508176cda767a0660df740e0f23820"));
	}
}
